// CLEO5 example script
// Sanny Builder 4
// mode: GTA SA (v1.0 - SBL)
{$CLEO .cs}

const Model_Speaker = 2229
const Audio_Path = ".\cleo_tests\Audio\Ding.mp3" // this script's file relative location

wait 1000

int soundStream, speakerObject
float value, valueCurr


while true
    wait 0
    print_formatted_now "CLEO5 Audio Plugin DEMO~n~Press key 1 - 7" {time} 0
    
    if
        test_cheat "1"
    then
        print_formatted_now "DEMO 1: Get progress" {time} 10000
        START_TEST()

        if
            not load_3d_audio_stream Audio_Path {store_to} soundStream
        then
            print_formatted_now "~r~Failed to load audio file!" {time} 10000
            END_TEST()
            continue
        end
        set_play_3d_audio_stream_at_object soundStream {object} speakerObject
        set_audio_stream_state soundStream AudioStreamAction.Play

        while is_audio_stream_playing soundStream
            valueCurr = get_audio_stream_progress soundStream
            print_formatted_now "DEMO 1: Get progress: %.2f" {time} 0 {args} valueCurr
            wait 0
        end

        END_TEST()
    end
    
    if
        test_cheat "2"
    then
        print_formatted_now "DEMO 2: Set volume" {time} 10000
        START_TEST()

        if
            not load_3d_audio_stream Audio_Path {store_to} soundStream
        then
            print_formatted_now "~r~Failed to load audio file!" {time} 10000
            END_TEST()
            continue
        end
        set_play_3d_audio_stream_at_object soundStream {object} speakerObject
        set_audio_stream_looped soundStream true
        set_audio_stream_state soundStream AudioStreamAction.Play

        TIMERA = 1000
        repeat
            if
                TIMERA >= 1000
            then
                value = generate_random_float_in_range 0.0 2.0
                set_audio_stream_volume soundStream value
                TIMERA = 0
            end

            print_formatted_now "DEMO 2: Set volume: %.2f~n~Press 2 to stop" {time} 0 {args} value
            wait 0
        until test_cheat "2"

        END_TEST()
    end
    
    if
        test_cheat "3"
    then
        print_formatted_now "Set volume with transition" {time} 10000
        START_TEST()

        if
            not load_3d_audio_stream Audio_Path {store_to} soundStream
        then
            print_formatted_now "~r~Failed to load audio file!" {time} 10000
            END_TEST()
            continue
        end
        set_play_3d_audio_stream_at_object soundStream {object} speakerObject
        set_audio_stream_looped soundStream true
        set_audio_stream_state soundStream AudioStreamAction.Play

        TIMERA = 2000
        repeat
            if
                TIMERA >= 2000
            then
                value = generate_random_float_in_range 0.0 2.0
                set_audio_stream_volume_with_transition soundStream {volume} value {timeMs} 1000
                TIMERA = 0
            end

            valueCurr = get_audio_stream_volume soundStream
            print_formatted_now "DEMO 3: Set volume: %.2f, Transition: 1.0s~n~Current volume: %.2f~n~Press 3 to stop" {time} 0 {args} value valueCurr
            wait 0
        until test_cheat "3"
        
        END_TEST()
    end
    
    if
        test_cheat "4"
    then
        print_formatted_now "DEMO 4: Set speed" {time} 10000
        START_TEST()

        if
            not load_3d_audio_stream Audio_Path {store_to} soundStream
        then
            print_formatted_now "~r~Failed to load audio file!" {time} 10000
            END_TEST()
            continue
        end
        set_play_3d_audio_stream_at_object soundStream {object} speakerObject
        set_audio_stream_looped soundStream true
        set_audio_stream_state soundStream AudioStreamAction.Play

        TIMERA = 1000
        repeat
            if
                TIMERA >= 1000
            then
                value = generate_random_float_in_range 0.0 2.0
                set_audio_stream_speed soundStream value
                TIMERA = 0
            end

            print_formatted_now "DEMO 4: Set speed %.2f~n~Press 4 to stop" {time} 0 {args} value
            wait 0
        until test_cheat "4"

        END_TEST()
    end
    
    if
        test_cheat "5"
    then
        print_formatted_now "DEMO 5: Set speed with transition" {time} 10000
        START_TEST()

        if
            not load_3d_audio_stream Audio_Path {store_to} soundStream
        then
            print_formatted_now "~r~Failed to load audio file!" {time} 10000
            END_TEST()
            continue
        end
        set_play_3d_audio_stream_at_object soundStream {object} speakerObject
        set_audio_stream_looped soundStream true
        set_audio_stream_state soundStream AudioStreamAction.Play

        TIMERA = 2000
        repeat
            if
                TIMERA >= 2000
            then
                value = generate_random_float_in_range 0.0 2.0
                set_audio_stream_speed_with_transition soundStream {volume} value {timeMs} 1000
                TIMERA = 0
            end

            valueCurr = get_audio_stream_speed soundStream
            print_formatted_now "DEMO 5: Set speed: %.2f, Transition: 1.0s~n~Current speed: %.2f~n~Press 5 to stop" {time} 0 {args} value valueCurr
            wait 0
        until test_cheat "5"

        END_TEST()
    end
    
    if
        test_cheat "6"
    then
        print_formatted_now "DEMO 6: Doppler effect" {time} 10000
        START_TEST()

        if
            not load_3d_audio_stream Audio_Path {store_to} soundStream
        then
            print_formatted_now "~r~Failed to load audio file!" {time} 10000
            END_TEST()
            continue
        end
        set_play_3d_audio_stream_at_object soundStream {object} speakerObject
        set_audio_stream_looped soundStream true
        set_audio_stream_volume soundStream {volume} 4.0
        set_audio_stream_state soundStream AudioStreamAction.Play
        wait 1000

        int direction = 0
        repeat
            if
                not camera_is_vector_move_running
            then
                camera_set_vector_track {from} 230.0 2525.0 16.5 {to} 230.0 2525.0 16.5 {time} 1000 {ease} true

                if
                    direction == 0
                then
                    camera_set_vector_move {from} 260.0 2522.0 18.0 {to} 200.0 2522.0 18.0 {time} 1000 {ease} true
                else
                    camera_set_vector_move {from} 200.0 2522.0 18.0 {to} 260.0 2522.0 18.0 {time} 1000 {ease} true
                end
                direction = 1 - direction
            end

            wait 0
            print_formatted_now "DEMO 6: Doppler effect~n~Press 6 to stop" {time} 0
        until test_cheat "6"

        END_TEST()
    end
    
    if
        test_cheat "7"
    then
        print_formatted_now "DEMO 7: Game speed changes" {time} 10000
        START_TEST()

        if
            not load_3d_audio_stream Audio_Path {store_to} soundStream
        then
            print_formatted_now "~r~Failed to load audio file!" {time} 10000
            END_TEST()
            continue
        end
        set_play_3d_audio_stream_at_object soundStream {object} speakerObject
        set_audio_stream_looped soundStream true
        set_audio_stream_state soundStream AudioStreamAction.Play

        // walk
        set_player_control 0 {control} false
        flush_route
        extend_route {xyz} 229.0 2525.0 15.5
        extend_route {xyz} 230.0 2524.0 15.5
        extend_route {xyz} 231.0 2525.0 15.5
        extend_route {xyz} 230.0 2526.0 15.5
        task_follow_point_route $scplayer {walk_speed} 6 {flag} 3
        task_look_at_object $scplayer {object} speakerObject {time} -1

        TIMERA = 2000
        repeat
            if
                TIMERA >= 2000
            then
                value = generate_random_float_in_range 0.2 3.0
                set_time_scale value
                TIMERA = 0
            end

            print_formatted_now "DEMO 7: Game speed: %.2f~n~Press 7 to stop" {time} 0 {args} value
            wait 0
        until test_cheat "7"

        set_time_scale 1.0
        clear_char_tasks_immediately $scplayer
        set_player_control 0 {control} true
        END_TEST()
    end
end

terminate_this_script


:START_TEST
    remove_all_char_weapons $scplayer
    set_max_wanted_level 0

    display_radar false
    display_hud false

    set_char_coordinates $scplayer {xyz} 230.0 2527.0 15.5
    set_char_heading $scplayer {heading} 180.0
    set_area_visible 0
    set_char_area_visible $scplayer {interiorId} 0
    task_scratch_head $scplayer

    set_fixed_camera_position {xyz} 230.0 2522.0 18.0 {ypr} 0.0 0.0 0.0
    point_camera_at_char $scplayer {mode} CameraMode.Fixed {switchStyle} SwitchType.JumpCut
    wait 1000
    
    // create speaker object (visual only)
    request_model {modelId} Model_Speaker
    load_all_models_now
    speakerObject = create_object {modelId} Model_Speaker {xyz} 230.25 2525.0 16.0
    mark_model_as_no_longer_needed {modelId} Model_Speaker
    set_object_collision speakerObject {state} false
    point_camera_at_point {xyz} 230.0 2525.0 16.5 {switchStyle} SwitchType.Interpolation
return


:END_TEST
    remove_audio_stream soundStream
    delete_object speakerObject
    camera_reset_new_scriptables
    restore_camera
    display_hud true
    display_radar true
return
